/*
 * random.h
 *
 * Copyright (C) 2008, 2009
 *
 * Lukasz Bieniasz-Krzywiec
 * Dariusz Leniowski
 */

#ifndef RANDOM_H_
#define RANDOM_H_

#include "../config.h"

class rnd {
public:
  rnd() {}
  virtual ~rnd() {}

  /*
   * Inicjalizuje generator losowy
   */
  virtual void init() = 0;

  /*
   * Zwraca calkowita liczbe losowa z przedzialu [0..n-1]
   * Argumenty:
   * - n -- koniec przedzialu
   * Zalozenia:
   * - wczesniej zostala wykonana funkcja init()
   */
  virtual int rand(int n) { return 0; }

  /*
   * Zwraca rzeczywista liczbe losowa z przedzialu [0..1)
   * Zalozenia:
   * - wczesniej zostala wykonana funkcja init()
   */
  virtual real rand() { return 0; }
};

class random_cpp : public rnd {
  struct drand48_data buffer;   

public:
  random_cpp();
  ~random_cpp();

  void init();
  int rand(int);
  real rand();
};

class random_parallel_cpp : public rnd {
  random_cpp ** generators;
public:
  random_parallel_cpp();
  ~random_parallel_cpp();

  void init();
  int rand(int);
  real rand();
};

#endif /* RANDOM_H_ */
